/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package clases;

import interfaz.dlg_presupuesto_prototipo;
import interfaz.frm_procesando;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author MARLENI
 */
public class ClsCalculos {

    private ClsMetodos metodos = new ClsMetodos();
    private ClsDatabase bd = new ClsDatabase();
    ClsCalculoPartida cal_part = new ClsCalculoPartida();
//    private dlg_presupuesto_prototipo dlg_presupuesto_prototipo;
//    frm_procesando dialog = new frm_procesando(new javax.swing.JFrame(), true);
    private dlg_presupuesto_prototipo dlg_presupuesto_prototipo;

    public ClsCalculos(dlg_presupuesto_prototipo dlg) {
        dlg_presupuesto_prototipo = dlg;
    }

    public void calculo(DefaultTableModel mdt, int i, String rendimiento, String metrado) {
        double subtotal = 0, precio_unitario = 0, cantidad = 0, cuadrilla = 0;
        String tipo_insumo = "", sub_categoria = "";
        tipo_insumo = mdt.getValueAt(i, 5).toString();
        // actualizando el rendimineto
        sub_categoria = mdt.getValueAt(i, 6).toString();
        // si es mano de obra y equipos que tienen rendimiento
        precio_unitario = Double.parseDouble(mdt.getValueAt(i, 3).toString());//temp
        if (tipo_insumo.equals("2") || (tipo_insumo.equals("3") && sub_categoria.equals("2"))) {
            String prueba_cuadrilla = mdt.getValueAt(i, 1).toString();
            //prueba_cuadrilla=prueba_cuadrilla.replace(",", "");
            cuadrilla = metodos.num_d(prueba_cuadrilla);
            cantidad = (cuadrilla * 8) / Double.parseDouble(rendimiento);
            cantidad = cantidad * Double.parseDouble(metrado.replace(",", ""));
//            mdt.setValueAt(metodos.redondeo_2(cantidad), i, 5);//cantidad
            mdt.setValueAt(cantidad, i, 2);//temp_cantidad
            subtotal = cantidad * precio_unitario;
        } else if (mdt.getValueAt(i, 7).toString().equals("%mo") == false) {
            cantidad = Double.parseDouble(mdt.getValueAt(i, 2).toString()) * Double.parseDouble(metrado.replace(",", ""));//cantidad
            mdt.setValueAt(cantidad, i, 2);//temp_cantidad
            subtotal = (cantidad * precio_unitario);
        }
//        mdt.setValueAt(metodos.redondeo_2(subtotal), i, 7);
        mdt.setValueAt(subtotal, i, 4);//temp

        // actualizando insumos precios e insumos ok....
        //bd.update("insumo", "precio='" + txtPrecio.getText().replace(",", "") + "'", " idinsumo='" + txtCodigoInsumo.getText() + "'");
    }

    public boolean verficacion_ceros(JTable tbl_presupuesto) {
        boolean v = true;
        DefaultTableModel mdt_presupuesto = (DefaultTableModel) tbl_presupuesto.getModel();
        int total_filas = mdt_presupuesto.getRowCount();
        for (int j = 0; j < total_filas; j++) {
            if (mdt_presupuesto.getValueAt(j, 9).toString().equals("0")) {
                double numero = Double.parseDouble(mdt_presupuesto.getValueAt(j, 4).toString().replace(",", ""));
                if (numero == 0) {
                    javax.swing.JOptionPane.showMessageDialog(null, "Ingrese el metrado");
                    tbl_presupuesto.changeSelection(j, 1, false, false);
                    tbl_presupuesto.editCellAt(j, 4);
                    v = false;
                    break;
                }
            }
        }
        return v;
    }

    public void grabar_presupuesto(String proyecto, String presupuesto, JTable tbl_presupuesto, interfaz.frm_procesando dlg) {
        try {
            bd.getConnection();


            String partida = "", rendimiento = "", orden = "", metrado = "", nombre_partida = "";
            PreparedStatement pstm = null;
            String sql = "";
            //elminando
            sql = "delete from partida_detalle where idproyecto='" + proyecto + "' and idpresupuesto='" + presupuesto + "'  ";
            pstm = bd.conn.prepareStatement(sql);
            pstm.execute();

            //Object[][] array_datos_partida = bd.select("partida_base", "idpartida,nombre,rendimiento,precio,tipo,idpartida_generica,idunidad", "idpartida='" + codigo + "'");
            DefaultTableModel mdt_presupuesto = (DefaultTableModel) tbl_presupuesto.getModel();
            DefaultTableModel mdt_partida = new DefaultTableModel(
                    new Object[][]{
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
                    new String[]{
                "1", "2", "3", "4", "5", "6", "7", "8"
            });

            int total_filas = mdt_presupuesto.getRowCount();
            double total = 0;
            double pre_mat = 0, pre_mo = 0, pre_eyh = 0, pre_serv = 0;

            //transanccion
            for (int j = 0; j < total_filas; j++) {
                if (mdt_presupuesto.getValueAt(j, 9).toString().equals("0")) {
//                    System.out.println("wisii.... ");
                    //acualizando cada partida
                    cal_part.partida_actualiza(mdt_presupuesto.getValueAt(j, 0).toString());
                    //actualizando cada partida
                    partida = mdt_presupuesto.getValueAt(j, 0).toString();
                    nombre_partida = mdt_presupuesto.getValueAt(j, 2).toString();
                    metrado = mdt_presupuesto.getValueAt(j, 4).toString();
                    rendimiento = mdt_presupuesto.getValueAt(j, 10).toString();
                    orden = mdt_presupuesto.getValueAt(j, 12).toString();
                    metodos.tablaLimpia(mdt_partida);
                    sql = " select pd.idinsumo,pd.cuadrilla"
                            + ",pd.cantidad,pd.precio_unitario,"
                            + "pd.precio_parcial,i.idinsumo_tipo,"
                            + "i.subcatergoria,u.simbolo"
                            + " FROM partida_base_detalle pd, insumo i,insumo_tipo t,unidad u "
                            + " where pd.idinsumo=i.idinsumo and  t.idinsumo_tipo=i.idinsumo_tipo and u.idunidad=i.idunidad and pd.idpartida='" + partida + "' "
                            + "ORDER BY t.idinsumo_tipo asc, i.idinsumo asc ";

                    pstm = bd.conn.prepareStatement(sql);
                    ResultSet res = pstm.executeQuery();
                    int n = 8;
                    while (res.next()) {
                        Object mat[] = new Object[n];
                        for (int i = 0; i < n; i++) {
                            mat[i] = res.getString(i + 1);
                        }
                        mdt_partida.addRow(mat);
                    }



                    int tot = mdt_partida.getRowCount();
//                System.out.println(tot);
                    //System.out.println(presupuesto);
                    //System.out.println(mdt_partida.getColumnCount());
//                System.out.println(mdt_partida.getValueAt(0, 2).toString());

                    for (int i = 0; i < tot; i++) {
                        calculo(mdt_partida, i, rendimiento, metrado);
                    }
                    desgaste(mdt_partida);
                    double val_mat = 0, val_mo = 0, val_eyh = 0, val_serv = 0, parcial = 0;
                    String tipo = "";
                    for (int i = 0; i < tot; i++) {

                        parcial = Double.parseDouble(mdt_partida.getValueAt(i, 4).toString());
                        tipo = mdt_partida.getValueAt(i, 5).toString();
                        total = total + parcial;
                        if (tipo.equals("1")) {
                            val_mat = val_mat + parcial;
                        } else if (tipo.equals("2")) {
                            val_mo = val_mo + parcial;
                        } else if (tipo.equals("3")) {
                            val_eyh = val_eyh + parcial;
                        } else if (tipo.equals("4")) {
                            val_serv = val_serv + parcial;
                        }
                        sql = " INSERT INTO partida_detalle (idproyecto, idpresupuesto, idpartida, orden,idinsumo,cuadrilla,cantidad,precio_unitario,precio_parcial) values('" + proyecto + "'"
                                + ",'" + presupuesto + "','" + partida + "','" + orden + "','" + mdt_partida.getValueAt(i, 0).toString() + "','"
                                + mdt_partida.getValueAt(i, 1).toString().replace(",", "") + "','" + mdt_partida.getValueAt(i, 2) + "',"
                                + "'" + mdt_partida.getValueAt(i, 3) + "','" + parcial + "')";
                        pstm = bd.conn.prepareStatement(sql);
                        pstm.execute();
                        // System.out.println(sql);


                    }

                    dlg.jLabel1.setText(nombre_partida);
                    int proceso = (j * 100) / total_filas;
                    dlg.jProgressBar1.setValue(proceso);
                    pre_mat = pre_mat + val_mat;
                    pre_mo = pre_mo + val_mo;
                    pre_eyh = pre_eyh + val_eyh;
                    pre_serv = pre_serv + val_serv;
                    sql = " update  presupuesto_partida set total_mat='" + val_mat + "', total_mo='" + val_mo + "', total_eyh='" + val_eyh + "', total_serv='" + val_serv + "' where  idproyecto='" + proyecto + "' and idpresupuesto='" + presupuesto + "'  and idpartida='" + partida + "' and orden='" + orden + "' ";
                    // System.out.println(sql);
                    pstm = bd.conn.prepareStatement(sql);
                    pstm.execute();

                }
            }

            sql = " update  presupuesto set  total_mat='" + pre_mat + "', total_mo='" + pre_mo + "', total_eyh='" + pre_eyh + "', total_serv='" + pre_serv + "' ,total_presupuesto='" + total + "' , estado_nombre='" + "Procesado" + "' where  idproyecto='" + proyecto + "' and idpresupuesto='" + presupuesto + "'  ";
            pstm = bd.conn.prepareStatement(sql);
            pstm.execute();
            pstm.close();
            dlg_presupuesto_prototipo.actualiza_estado_presupuesto(2);
        } catch (Exception e) {
            System.err.println(e);
            e.printStackTrace();
            ClsException._exceptionWriteFile(e, "insertando partidas");
        }
    }

    public double calculoManoObra(DefaultTableModel mdt) {
        //mano de obra
        double valor = 0;
        int total_filas = mdt.getRowCount();
        for (int i = 0; i < total_filas; i++) {
            if (mdt.getValueAt(i, 5).toString().equals("2")) {
                valor = valor + Double.parseDouble(mdt.getValueAt(i, 4).toString());//temp_precio
            }
        }
        return valor;
    }

    public void desgaste(DefaultTableModel mdt) {
        //mano de obra
        double valor = 0;

        int total_filas = mdt.getRowCount();
        for (int i = 0; i < total_filas; i++) {
            if (mdt.getValueAt(i, 7).toString().equals("%mo")) {
                double total_mano_obra = calculoManoObra(mdt);
                mdt.setValueAt(total_mano_obra, i, 3);//temp
                valor = ((Double.parseDouble(mdt.getValueAt(i, 2).toString()) * total_mano_obra) / 100);
                mdt.setValueAt(valor, i, 4);//temp
                // System.out.println("rendimiento " + Double.parseDouble(mdt.getValueAt(i, 11).toString()));
                break;
            }
        }
    }

    public void actualizaPartidaIndividual(DefaultTableModel mdt, int i, String rendimiento, String metrado) {
        DefaultTableModel mdt_partida = new DefaultTableModel(
                new Object[][]{
            {null, null, null, null},
            {null, null, null, null},
            {null, null, null, null},
            {null, null, null, null}
        },
                new String[]{
            "1", "2", "3", "4", "5", "6", "7", "8"
        });

        double subtotal = 0, precio_unitario = 0, cantidad = 0, cuadrilla = 0;
        String tipo_insumo = "", sub_categoria = "";
        tipo_insumo = mdt.getValueAt(i, 5).toString();
        // actualizando el rendimineto
        sub_categoria = mdt.getValueAt(i, 6).toString();
        // si es mano de obra y equipos que tienen rendimiento
        precio_unitario = Double.parseDouble(mdt.getValueAt(i, 3).toString());//temp
        if (tipo_insumo.equals("2") || (tipo_insumo.equals("3") && sub_categoria.equals("2"))) {
            String prueba_cuadrilla = mdt.getValueAt(i, 1).toString();
            //prueba_cuadrilla=prueba_cuadrilla.replace(",", "");
            cuadrilla = metodos.num_d(prueba_cuadrilla);
            cantidad = (cuadrilla * 8) / Double.parseDouble(rendimiento);
            cantidad = cantidad * Double.parseDouble(metrado);
//            mdt.setValueAt(metodos.redondeo_2(cantidad), i, 5);//cantidad
            mdt.setValueAt(cantidad, i, 2);//temp_cantidad
            subtotal = cantidad * precio_unitario;
        } else if (mdt.getValueAt(i, 7).toString().equals("%mo") == false) {
            cantidad = Double.parseDouble(mdt.getValueAt(i, 2).toString()) * Double.parseDouble(metrado);//cantidad
            mdt.setValueAt(cantidad, i, 2);//temp_cantidad
            subtotal = (cantidad * precio_unitario);
        }
//        mdt.setValueAt(metodos.redondeo_2(subtotal), i, 7);
        mdt.setValueAt(subtotal, i, 4);//temp

        // actualizando insumos precios e insumos ok....
        //bd.update("insumo", "precio='" + txtPrecio.getText().replace(",", "") + "'", " idinsumo='" + txtCodigoInsumo.getText() + "'");
    }
}
